﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Serialization;
using Marin.Entities;
using Marin.Service;

namespace Marin.UI
{
    public partial class frmListIngresos : Form
    {
        private ICuentaService cuentaService;
        private IIngresoService ingresoService;
        private bool IsNew = true;

        public frmListIngresos()
        {
            InitializeComponent();
            cuentaService = new CuentaService();
            ingresoService = new IngresoService();
        }

        public void AddIngreso()
        {
            ingresoBindingSource.AddNew();
        }

        public void UpdateIngres(Int32 id)
        {
            IsNew = false;

            var ingreso = ingresoService.GeTfromIngresoById(id);
            ingresoBindingSource.DataSource = ingreso;
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            var criterio = txtCriterio.Text == string.Empty ? null : txtCriterio.Text;

            cuentaBindingSource.DataSource = cuentaService.GetAllFromCuentasByCriterio(criterio);
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            var ingreso = cuentaBindingSource.Current as Cuenta;
            var currentCuenta = ingresoBindingSource.Current as Ingreso;

            if (ingreso != null)
            {
                var detalle = new DetalleIngreso()
                {
                    IdIngreso = currentCuenta.Id,
                    IdCuenta = ingreso.Id,
                    Cuenta = ingreso,
                    Cantidad = 1,
                    PrecioUnt = ingreso.Precio
                };

                //var existe = currentCuenta.DetalleIngresoes
                //    .Where(dp => dp.Cuenta
                //        .Id.Equals(ingreso.Id)).SingleOrDefault();

                //if (existe == null)
                //{
                    currentCuenta.DetalleIngresoes.Add(detalle);

                    currentCuenta.Total =
                        currentCuenta.DetalleIngresoes.Sum(dp => dp.Monto);
                //}
                //else
                //{
                //    var rpt = MessageBox.Show(this,
                //        string.Format("El producto: {0}," +
                //                      "ya se encuentra en le pedido desea agregra otro?", ingreso.Descripcion),
                //        "Mensaje",
                //        MessageBoxButtons.YesNo,
                //        MessageBoxIcon.Question);

                //    if (rpt == DialogResult.Yes)
                //    {
                //        existe.Cantidad++;
                //        currentCuenta.Total =
                //            currentCuenta.DetalleIngresoes.Sum(dp => dp.Monto);
                //    }
                //}



                ingresoBindingSource.ResetBindings(true);
                detalleIngresoesBindingSource.ResetBindings(true);
            }
            else
            {
                MessageBox.Show("Ingreso no Agregado..!!");
            }
        }
        public void CalcularSaldo()
        {
            var ingreso = ingresoBindingSource.Current as Ingreso;

            if (ingreso != null)
            {
                ingreso.Saldo = ingreso.Saldo + ingreso.Total;
                ingresoBindingSource.ResetBindings(true);
            }
        }
        private void btnGuardar_Click(object sender, EventArgs e)
        {
            var ingreso = ingresoBindingSource.Current as Ingreso;
            ingreso.Fecha = fechaDateTimePicker.Value;
            if (ingreso != null)
            {
                try
                {
                    if (IsNew)
                    {
                        ingresoService.AddIngreso(ingreso);
                        IsNew = false;
                        MessageBox.Show(this, "Registro Correcto",
                            "Mensaje",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                        CalcularSaldo();
                        Close();
                    }
                    else
                    {
                        ingresoService.UpdateIngreso(ingreso);
                       UpdateIngres(ingreso.Id);
                        MessageBox.Show(this, "Actualización Correcta",
                            "Mensaje",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                        CalcularSaldo();
                        Close();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message,
                        "Mensaje",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Stop);
                }
            }
        }
        private void CalcularTotal()
        {
            var ingreso = ingresoBindingSource.Current as Ingreso;

            if (ingreso != null)
            {
                ingreso.Total = ingreso.DetalleIngresoes.Sum(dp => dp.Monto);

                ingresoBindingSource.ResetBindings(true);
            }
        }
        private void btnEliminar_Click(object sender, EventArgs e)
        {
            var detalle = detalleIngresoesBindingSource.Current as DetalleIngreso;

            if (detalle!=null)
            {
                var rpt = MessageBox.Show(this,
                    string.Format("Desea quitar la cuenta: {0}, del Pago???",
                                    detalle.Cuenta.Descripcion),
                    "Mensaje",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question);

                if (rpt == DialogResult.Yes)
                {
                    detalleIngresoesBindingSource.RemoveCurrent();
                    CalcularTotal();
                    CalcularSaldo();
                }
            }
            else
            {
                MessageBox.Show("Debe selecionar Una cuenta");
            }
        }

        private void frmListIngresos_Load(object sender, EventArgs e)
        {
            
            totalLabel1.Text = "0.00";
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            var frmCuenta = new frmMttCuenta();
            frmCuenta.AddCuenta();
            frmCuenta.ShowDialog();
        }

        private void detalleIngresoesDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            CalcularTotal();
            CalcularSaldo();
        }
    }
}
